package _12_LianXi;

/**
 * 编写程序，实现3个窗口同时卖票，但是票不重复。(线程同步)
 * 
 * @User wings
 * @时间 2020年7月24日下午6:52:21
 */
public class _11_ {

	public static void main(String[] args) {
		// 创建卖票对象
		Sale sale = new Sale(100);
		// 创建3个卖票窗口
		Thread t1 = new Thread(new P1(sale));
		Thread t2 = new Thread(new P1(sale));
		Thread t3 = new Thread(new P1(sale));
		// 改名
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		// 启动卖票线程
		t1.start();
		t2.start();
		t3.start();
	}
}

class P1 implements Runnable {
	// 标志 true说明没卖完,false说明卖完了
	static boolean flag = true;

	// 业务类
	Sale sale;

	public P1(Sale sale) {
		super();
		this.sale = sale;
	}

	@Override
	public void run() {
		while (flag) {
			sale.SalePiao();
		}
	}
}

// 业务类
class Sale {

	int ticket = 100;

	public Sale(int ticket) {
		super();
		ticket = ticket;
	}

	public synchronized void SalePiao() {
		// 把其他线程唤醒准备取票,否则 wait之后 不会自动醒,
		this.notifyAll();

		// 判断车票是否卖完
		if (ticket > 0) {
			System.out.println(Thread.currentThread().getName() + "卖出了" + ticket);
			// 票数 --
			ticket--;
		} else {
			System.out.println("票票卖完了");

			// 标志为false,说明卖完了
			P1.flag = false;
			// 终止函数运行
			return;
		}

		try {
			// 睡眠一会,打印效果更直观
			Thread.sleep(10);

			// 取完就挂起,否则由于循环执行快的问题,会导致一个窗口连续卖票
			this.wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
